<?php 
/**
*file UpTool.class.php
*文件上传类
*@author houtiz
*@version 1.0
*
*@param $allowext 允许的格式
*@param $maxsize 允许最大文件 M为单位
*按日期生成目录,随机文件名,获取文件后缀,验证后缀,验证大小(动态添加允许的后缀及大小)
*上传失败时 错误提示
*@param $errornum  显示错误代号
*@param array $error  错误代号对应的错误提示
*/
defined('ACC') ||exit ('ACC Denied');

class UpTool{
    protected $allowext = 'jpg,jpeg,gif,bmp,png,txt,doc,pdf'; 
    protected $maxsize = 2;

    protected $errornum = 0;
    protected $error = array(
                    0=>'无错',
                    1=>'上传文件超出系统限制',
                    2=>'上传文件大小超出网页表单页面限制',
                    3=>'文件只上传了部分',
                    4=>'文件没有被上传',
                    6=>'找不到临时文件',
                    7=>'文件写入失败',
                    8=>'不允许的文件后缀',
                    9=>'文件大小超出了类的范围', 
                    10=>'创建目录失败',
                    11=>'移动失败' 
                    );
/**
*上传
*@param $_FILES['key']  $key
*/
public function Up($key){
    if (!isset($_FILES[$key])) {   //图片不存在
        return false;
    }                              //图片存在

    $k = $_FILES[$key];

    if ($k['error']) {            //检验有没有上传成功
        $this->errornum = $k['error'];
        return false;
    }
    //获取后缀 验证后缀
    $ext = $this->getExt($k['name']);
    if (!$this->isAllowExt($ext)) {
        $this->errornum = 8;
        return false;
    }
    //验证大小
    if(!$this->isAllowSize($k['size'])){
        $this->errornum = 9;
        return false;
    }
      //通过  创建目录
      $dir = $this->mk_dir();
      if ($dir == false) {
        $this->errornum = 10;
        return false;
      }
      //生成随机文件名
      $newname = $this->randName() . '.' . $ext;
      $dir = $dir . '/' . $newname;
      //移动文件并随机文件名
      if (!move_uploaded_file($k['tmp_name'], $dir)) {
        $this->errornum = 11;
        return false;
      }
     return str_replace(ROOT, '',$dir);    //把ROOT替换成空字符串 变只剩绝对路径    
}

/**
*报错方法
*/
public function getError(){
    return $this->error[$this->errornum];
}
/**
*动态添加允许的后缀
*@param  string $exts
*/    
public function setExt($exts){

}
/**
*动态添加允许的大小
*@param  string $size
*/    
public function setSize($size){
    
}

/**
*获取文件后缀
*@param string $file
*return string $ext
*/
protected function getExt($file){
    $tmp = explode('.', $file);
    return end($tmp);
}

/**
*验证文件后缀 是否允许内的后缀
*@param string $ext  
*都转成小写 防止大小写问题
*return bool
*/
protected function isAllowExt($ext){
    return in_array(strtolower($ext), explode(',', strtolower($this->allowext)));
}

/**
*验证大小
*@param $size
*return bool
*/
protected function isAllowSize($size){
    return $size <= $this->maxsize*1024*1024;
}

/**
*按日期自动创建目录
*@param 目录 $dir
*return miaxd
*/
protected function mk_dir(){
    $dir = ROOT.'upload/'.date('Ym/d');

    if (is_dir($dir) || mkdir($dir,0777,true)) {
        return $dir;
    }else {
        return false;
    }
}

/**
*随机生成文件名
*@param string $str
*@param int $length
*return string
*/
protected function randName($length=6){
    $str = 'qwertyuiopasdfghjklzxcvbnm23456789';
    return substr(str_shuffle($str), 0,$length);
}





}
?>